﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Colaboradores.Models;
using Colaboradores.Persistencia;

namespace Colaboradores.Controllers
{
    public class FuncController : Controller
    {
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Index()
        {
            Cls_ListaFunc ListaFunc = new Cls_ListaFunc(Persistencia_Func.Listar());
            return View(ListaFunc);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(String Tipo, String Pesquisa = "")
        {
            IList<Cls_Func> lstFunc;
            if (Pesquisa != "")
            {
                if (Tipo == "Mat")
                {
                    lstFunc = new List<Cls_Func>();
                    try
                    {
                        Cls_Func func;
                        func = Persistencia_Func.ConsultarPorMatricula(int.Parse(Pesquisa));
                        if (func != null)
                        {
                            lstFunc.Add(func);
                        }
                        ViewData["Pesquisa"] = "Matrícula: " + Pesquisa;
                    }
                    catch (Exception)
                    {
                        ViewData["Pesquisa"] = "Pesquisa de Matrícula Inválida: " + Pesquisa;
                    }
                }
                else
                {
                    lstFunc = Persistencia_Func.ConsultarPorNome(Pesquisa);
                    ViewData["Pesquisa"] = "Nome: " + Pesquisa;
                }
            }
            else
            {
                lstFunc = Persistencia_Func.Listar();
            }

            Cls_ListaFunc listaFunc = new Cls_ListaFunc(lstFunc);
            return View(listaFunc);
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ViewResult Novo()
        {
            ViewData["Depto.Cod"] = new SelectList(Persistencia_Depto.Listar(),
                                                   "Cod",
                                                   "Dsc");
            ViewData["Cargo.Cod"] = new SelectList(Persistencia_Cargo.Listar(),
                                                   "Cod",
                                                   "Dsc");
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ViewResult Novo(Cls_Func func)
        {
            if (!ModelState.IsValid)
            {
                ViewData["Depto.Cod"] = new SelectList(Persistencia_Depto.Listar(),
                                                       "Cod",
                                                       "Dsc",
                                                       func.Depto.Cod);
                ViewData["Cargo.Cod"] = new SelectList(Persistencia_Cargo.Listar(),
                                                       "Cod",
                                                       "Dsc",
                                                       func.Cargo.Cod);
                return View("Novo", func);
            }

            try
            {
                Persistencia_Func.Inserir(func);
            }
            catch (FuncionarioExistenteException)
            {
                ViewData["Mensagem"] = "Funcionário já existe. Inclusão não efetuada!";
                return View("Sucesso", func);
            }

            ViewData["Mensagem"] = "Cadastrado com Sucesso!";
            return View("Sucesso", func);
        }

        [AcceptVerbs(HttpVerbs.Get)]
        public ViewResult Alterar(int Mat = 0)
        {
            Cls_Func func = Persistencia_Func.ConsultarPorMatricula(Mat);

            ViewData["Depto.Cod"] = new SelectList(Persistencia_Depto.Listar(),
                                                   "Cod",
                                                   "Dsc",
                                                    func.Depto.Cod);

            ViewData["Cargo.Cod"] = new SelectList(Persistencia_Cargo.Listar(),
                                                   "Cod",
                                                   "Dsc",
                                                   func.Cargo.Cod);

            return View(func);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ViewResult Alterar(Cls_Func func)
        {
            if (!ModelState.IsValid)
            {
                if (func.Depto != null)
                {
                    ViewData["Depto.Cod"] = new SelectList(Persistencia_Depto.Listar(),
                                                           "Cod",
                                                           "Dsc",
                                                           func.Depto.Cod);
                }
                else
                {
                    ViewData["Depto.Cod"] = new SelectList(Persistencia_Depto.Listar(),
                                           "Cod",
                                           "Dsc");
                }

                if (func.Cargo != null)
                {
                    ViewData["Cargo.Cod"] = new SelectList(Persistencia_Cargo.Listar(),
                                                           "Cod",
                                                           "Dsc",
                                                           func.Cargo.Cod);
                }
                else
                {
                    ViewData["Cargo.Cod"] = new SelectList(Persistencia_Cargo.Listar(),
                                                           "Cod",
                                                           "Dsc");
                }
                return View("Alterar", func);
            }

            try
            {
                Persistencia_Func.Alterar(func);
            }
            catch (FuncionarioNaoExistenteException)
            {
                ViewData["Mensagem"] = "Funcionário não existe. Alteração não Efetuada!";
                return View("Sucesso", func);
            }

            ViewData["Mensagem"] = "Alterado com Sucesso!";
            return View("Sucesso", func);
        }

        public ViewResult Excluir(int Mat = 0, String Nom = "", int Dep = 0, int Car = 0)
        {
            Cls_Func func = Persistencia_Func.ConsultarPorMatricula(Mat);
            if (func != null)
            {
                Persistencia_Func.Excluir(func);
                ViewData["Mensagem"] = "Excluído com Sucesso!";
            }
            else
            {
                func = new Cls_Func(Mat, 
                                    Nom,
                                    Persistencia_Depto.ConsultarPorCodigo(Dep),
                                    Persistencia_Cargo.ConsultarPorCodigo(Car));
                ViewData["Mensagem"] = "Funcionário não encontrado. Exclusão não efetuada!";
            }

            return View("Sucesso", func);
        }
    }
}
